package simulaco.dao;

import gminet.infra.dao.DataAccessObject;
import gminet.infra.db.TransactionException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import simulaco.dto.Usuario;
import simulaco.dto.UsuarioLog;

public class UsuarioLogDAO extends DataAccessObject {

    public static List<UsuarioLog> findByUsuario(Usuario usuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("SELECT A.CD_USUARIO      CD_USUARIO ");
        sbSql.append("     , A.TS_CADASTRO     TS_ACESSO  ");
        sbSql.append("  FROM USUARIO    A ");
        sbSql.append(" WHERE A.CD_USUARIO = ? ");
        sbSql.append(" ORDER BY A.TS_CADASTRO ");
        List<UsuarioLog> usuarioLogsList = new ArrayList<UsuarioLog>(100);
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            setInt(ps, 1, usuario.getCodigo());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                UsuarioLog usuarioLog = fromResultSet(rs);
                usuarioLogsList.add(usuarioLog);
            }
            close(rs);
        } catch (SQLException sqle) {
            throw new TransactionException("UsuarioLogDAO.findAll (" + sqle.getMessage() + ")");
        }
        return usuarioLogsList;
    }

    public static void insert(UsuarioLog usuarioLog, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("INSERT INTO USUARIO  ");
        sbSql.append("     ( CD_USUARIO    ");
        sbSql.append("     , TS_ACESSO     ");
        sbSql.append(") VALUES (?,?) ");
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            int pos = 1;
            setInt(ps, pos++, usuarioLog.getCodigo());
            setTimestamp(ps, pos++, usuarioLog.getDataAcesso());
            ps.executeUpdate();
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("UsuarioLogDAO.insert (" + sqle.getMessage() + ")");
        }
    }

    public static void deleteByUsuario(Usuario usuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("DELETE FROM USUARIO  ");
        sbSql.append(" WHERE CD_USUARIO = ?");
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            setInt(ps, 1, usuario.getCodigo());
            ps.executeUpdate();
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("UsuarioLogDAO.delete (" + sqle.getMessage() + ")");
        }
    }

    private static UsuarioLog fromResultSet(ResultSet rs) throws SQLException {

        // USUARIO
        UsuarioLog usuarioLog = new UsuarioLog();
        usuarioLog.setCodigo(getInt(rs, "CD_USUARIO"));
        usuarioLog.setDataAcesso(getDateFromTimestamp(rs, "TS_ACESSO"));
        //
        return usuarioLog;
    }

}
